#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;


template <class T = int,int kCapacity = 10>
class Stack
{
public:
    Stack()
        : _top(-1)
          , _data(new T[kCapacity]())
    {}

    ~Stack(){
        if(_data){
            delete [] _data;
            _data = nullptr;
        }
    }

    bool empty() const
    {
        return _top == -1;
    }

    bool full() const
    {
        return _top == kCapacity - 1;
    }

    void push(const T & t);

    void pop()
    {
        if(!empty()){
            --_top;
        }else{
            cout << "栈已空" << endl;
        }
    }

    T top()
    {
        if(!empty()){
            return _data[_top];
        }else{
            throw "栈为空，没有栈顶元素";
        }
    }
private:
    int _top;
    T * _data;
};

//类模板的成员函数如果在类定义之外实现
//不仅要写出模板声明的部分
//还需要在类作用域限定的地方写出类的完整名称
template <class T,int kCapacity>
void Stack<T,kCapacity>::push(const T & t)
{
    if(!full()){
        _data[++_top] = t;
    }else{
        cout << "栈已满" << endl;
    }
}

//普通函数与函数模板可以重载
//普通类与类模板不能重载
/* class Stack */
/* {}; */

void test0(){
    Stack<int> s1;
    Stack<double,20> s2;
    Stack<string> s3;
    Stack<> s4;
}

int main(void){
    test0();
    return 0;
}
